home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 1999 February / maximum-cd-1999-02.iso / Utilities / Internet / Internet Explorer 4.01 / JAVI386.CAB / xmldso4.cab / com / ms / xml / dso / XMLDSO.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-10-10  |  8.7 KB  |  501 lines

  1. package com.ms.xml.dso;
  2.  
  3. import com.ms.osp.DataSourceListener;
  4. import com.ms.osp.OLEDBSimpleProvider;
  5. import com.ms.xml.om.Document;
  6. import com.ms.xml.om.Element;
  7. import com.ms.xml.om.ElementEnumeration;
  8. import com.ms.xml.util.Name;
  9. import com.ms.xml.util.XMLOutputStream;
  10. import java.applet.Applet;
  11. import java.awt.Color;
  12. import java.awt.Component;
  13. import java.awt.Dimension;
  14. import java.awt.FontMetrics;
  15. import java.awt.Graphics;
  16. import java.io.ByteArrayOutputStream;
  17. import java.io.FileOutputStream;
  18. import java.io.StringBufferInputStream;
  19. import java.net.URL;
  20. import java.util.Enumeration;
  21. import java.util.TooManyListenersException;
  22. import java.util.Vector;
  23. import netscape.javascript.JSObject;
  24.  
  25. public class XMLDSO extends Applet {
  26.    private XMLRowsetProvider myProvider;
  27.    private DataSourceListener myDSL;
  28.    private Document document = new Document();
  29.    private Document schema;
  30.    private Element schemaRoot;
  31.    private String error;
  32.    private URL url;
  33.    private boolean loaded = false;
  34.    private boolean inlineXML = false;
  35.    static Name nameOSP = Name.create("OSP");
  36.  
  37.    public Object getSchema() {
  38.       if (this.schema != null) {
  39.          ByteArrayOutputStream var1 = new ByteArrayOutputStream();
  40.  
  41.          try {
  42.             this.schema.save(new XMLOutputStream(var1));
  43.          } catch (Exception var4) {
  44.             this.setError(((Throwable)var4).toString());
  45.          }
  46.  
  47.          return var1.toString();
  48.       } else {
  49.          return null;
  50.       }
  51.    }
  52.  
  53.    private int drawText(Graphics var1, String var2, int var3, int var4, int var5, boolean var6, int var7) {
  54.       if (var2 != null && var2.length() != 0) {
  55.          if (var5 < 5) {
  56.             return var4;
  57.          } else {
  58.             int var8 = 0;
  59.             int var10 = 0;
  60.             int var9;
  61.             if (var7 == 0) {
  62.                var9 = var2.length();
  63.             } else {
  64.                var9 = var7;
  65.             }
  66.  
  67.             while(var8 < var9 && var6 && this.isWhiteSpace(var2.charAt(var8))) {
  68.                ++var8;
  69.             }
  70.  
  71.             FontMetrics var11 = var1.getFontMetrics();
  72.             int var12 = var8;
  73.             int var13 = var8;
  74.  
  75.             while(var8 < var9) {
  76.                char var14 = var2.charAt(var8);
  77.                int var15 = var11.charWidth(var14);
  78.                var10 += var15;
  79.                if (var10 <= var5 && var14 != '\n') {
  80.                   if (var6 && this.isWhiteSpace(var14)) {
  81.                      var12 = var8;
  82.                   }
  83.  
  84.                   ++var8;
  85.                } else {
  86.                   if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') {
  87.                      var12 = var8 - 1;
  88.                   } else if (var13 == var12) {
  89.                      var12 = var8;
  90.                   }
  91.  
  92.                   String var16 = var2.substring(var13, var12);
  93.                   var1.drawString(var16, var3, var4 + var11.getMaxAscent());
  94.                   var4 += var11.getHeight();
  95.                   if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') {
  96.                      var12 = var8 + 1;
  97.                   }
  98.  
  99.                   while(var6 && var12 < var9 && this.isWhiteSpace(var2.charAt(var12))) {
  100.                      ++var12;
  101.                   }
  102.  
  103.                   var8 = var12;
  104.                   var13 = var12;
  105.                   var10 = 0;
  106.                }
  107.             }
  108.  
  109.             String var17 = var2.substring(var13);
  110.             var1.drawString(var17, var3, var4 + var11.getMaxAscent());
  111.             return var4;
  112.          }
  113.       } else {
  114.          return var4;
  115.       }
  116.    }
  117.  
  118.    boolean updateTree(Element var1, Element var2, XMLRowsetProvider var3) {
  119.       int var4 = var2.getType();
  120.       if (var4 != 2 && var4 != 5) {
  121.          if (var4 != 1 && var4 != 11) {
  122.             String var5 = (String)var2.getAttribute("UPDATE-ACTION");
  123.             if (var5 == null || !var5.equalsIgnoreCase("APPEND") && !var5.equalsIgnoreCase("INSERT")) {
  124.                int var19 = var2.numElements();
  125.                if (var19 > 0) {
  126.                   int var20 = 0;
  127.                   ElementEnumeration var21 = new ElementEnumeration(var1, var2.getTagName(), 0);
  128.  
  129.                   while(var21.hasMoreElements()) {
  130.                      ++var20;
  131.                      Element var22 = (Element)var21.nextElement();
  132.                      XMLRowsetProvider var10 = null;
  133.                      if (var3 != null) {
  134.                         var10 = var3.findChildProvider(var22);
  135.                      }
  136.  
  137.                      Vector var12 = new Vector();
  138.                      boolean var13 = false;
  139.                      ElementEnumeration var11 = new ElementEnumeration(var2);
  140.  
  141.                      while(var11.hasMoreElements()) {
  142.                         Element var14 = (Element)var11.nextElement();
  143.                         String var15 = (String)var14.getAttribute("UPDATE-ACTION");
  144.                         if (var15 != null && !var15.equalsIgnoreCase("APPEND") && !var15.equalsIgnoreCase("INSERT")) {
  145.                            var12.addElement(var14);
  146.                         } else {
  147.                            var13 = this.updateTree(var22, var14, var10);
  148.                            if (!var13) {
  149.                               break;
  150.                            }
  151.                         }
  152.                      }
  153.  
  154.                      if (var13) {
  155.                         Enumeration var23 = var12.elements();
  156.  
  157.                         while(var23.hasMoreElements()) {
  158.                            Element var24 = (Element)var23.nextElement();
  159.                            String var16 = (String)var24.getAttribute("UPDATE-ACTION");
  160.                            var24.removeAttribute("UPDATE-ACTION");
  161.                            if (var3 != null) {
  162.                               if (var16.equalsIgnoreCase("REPLACE")) {
  163.                                  int var17 = this.getColumn(var3.getSchema(), var24);
  164.                                  var3.setVariant(var20, var17, 0, var24.getText());
  165.                               } else if (var16.equalsIgnoreCase("REMOVE")) {
  166.                                  int var25 = this.getColumn(var3.getSchema(), var24);
  167.                                  var3.setVariant(var20, var25, 0, "");
  168.                               }
  169.                            } else {
  170.                               ElementEnumeration var26 = new ElementEnumeration(var22, var24.getTagName(), 0);
  171.                               Element var18 = (Element)var26.nextElement();
  172.                               if (var16.equalsIgnoreCase("REPLACE")) {
  173.                                  var22.addChild(var24, var18);
  174.                                  if (var18 != null) {
  175.                                     var22.removeChild(var18);
  176.                                  }
  177.                               } else if (var16.equalsIgnoreCase("REMOVE") && var18 != null) {
  178.                                  var22.removeChild(var18);
  179.                               }
  180.                            }
  181.                         }
  182.  
  183.                         return true;
  184.                      }
  185.                   }
  186.                }
  187.  
  188.                return false;
  189.             } else {
  190.                var2.removeAttribute("UPDATE-ACTION");
  191.                if (var3 != null) {
  192.                   int var6 = 1;
  193.                   if (var5.equalsIgnoreCase("APPEND")) {
  194.                      var6 += var3.getRowCount();
  195.                   }
  196.  
  197.                   var3.insertRows(var6, 1);
  198.                   ElementEnumeration var7 = new ElementEnumeration(var2, (Name)null, 0);
  199.  
  200.                   while(var7.hasMoreElements()) {
  201.                      Element var8 = (Element)var7.nextElement();
  202.                      int var9 = this.getColumn(var3.getSchema(), var8);
  203.                      var3.setVariant(var6, var9, 0, var8.getText());
  204.                   }
  205.                } else {
  206.                   var1.addChild(var2, (Element)null);
  207.                }
  208.  
  209.                return true;
  210.             }
  211.          } else {
  212.             return var1.getText().equals(var2.getText());
  213.          }
  214.       } else {
  215.          return true;
  216.       }
  217.    }
  218.  
  219.    public void handleUpdate(Element var1) {
  220.       if (this.document == null) {
  221.          this.document = new Document();
  222.          this.document.addChild(var1, (Element)null);
  223.          this.updateSchema();
  224.       } else {
  225.          Element var2 = this.document.getRoot();
  226.          ElementEnumeration var3 = new ElementEnumeration(var1);
  227.  
  228.          while(var3.hasMoreElements()) {
  229.             Element var4 = (Element)var3.nextElement();
  230.             this.updateTree(var2, var4, this.myProvider);
  231.          }
  232.  
  233.       }
  234.    }
  235.  
  236.    public Object getDocument() {
  237.       return this.document;
  238.    }
  239.  
  240.    void generateSchema(Element var1, SchemaNode var2) {
  241.       ElementEnumeration var3 = new ElementEnumeration(var1);
  242.  
  243.       while(var3.hasMoreElements()) {
  244.          Element var4 = (Element)var3.nextElement();
  245.          int var5 = var4.getType();
  246.          Name var6 = var4.getTagName();
  247.          if (var5 == 0) {
  248.             SchemaNode var7 = var2.setRow(var6);
  249.             this.generateSchema(var4, var7);
  250.          }
  251.       }
  252.  
  253.       if (var2.e == null) {
  254.          var2.createElement(false);
  255.       }
  256.  
  257.    }
  258.  
  259.    public void paint(Graphics var1) {
  260.       Dimension var2 = ((Component)this).size();
  261.       if (var2.width > 0 && var2.height > 0) {
  262.          if (this.error == null) {
  263.             var1.setColor(Color.green);
  264.          } else {
  265.             var1.setColor(Color.red);
  266.          }
  267.  
  268.          var1.fillRect(0, 0, var2.width, var2.height);
  269.          String var3 = this.error;
  270.          if (var3 == null) {
  271.             if (this.url != null) {
  272.                var3 = "Successfully loaded XML from \"" + this.url.toString() + "\"";
  273.             } else if (this.inlineXML) {
  274.                var3 = "Successfully loaded inline XML";
  275.             } else if (this.document.getRoot() != null) {
  276.                var3 = "Successfully loaded document.";
  277.             } else {
  278.                var3 = "Empty";
  279.             }
  280.          }
  281.  
  282.          var1.setColor(Color.black);
  283.          this.drawText(var1, var3, 5, 5, var2.width - 10, true, 0);
  284.       }
  285.  
  286.    }
  287.  
  288.    public Object getXML() {
  289.       if (this.document != null) {
  290.          ByteArrayOutputStream var1 = new ByteArrayOutputStream();
  291.  
  292.          try {
  293.             XMLOutputStream var2 = new XMLOutputStream(var1);
  294.             this.document.save(var2);
  295.          } catch (Exception var4) {
  296.             this.setError(((Throwable)var4).toString());
  297.          }
  298.  
  299.          return var1.toString();
  300.       } else {
  301.          return null;
  302.       }
  303.    }
  304.  
  305.    public void setRoot(Element var1) {
  306.       this.document = new Document();
  307.       this.document.addChild(var1, (Element)null);
  308.       this.updateSchema();
  309.    }
  310.  
  311.    public Element getRoot() {
  312.       return this.document != null ? this.document.getRoot() : null;
  313.    }
  314.  
  315.    private boolean isWhiteSpace(char var1) {
  316.       return Character.isSpace(var1) || var1 == '\r';
  317.    }
  318.  
  319.    public void load(String var1) {
  320.       URL var2 = ((Applet)this).getDocumentBase();
  321.       this.loaded = false;
  322.  
  323.       try {
  324.          if (var2 == null) {
  325.             this.url = new URL(var1);
  326.          } else {
  327.             this.url = new URL(var2, var1);
  328.          }
  329.  
  330.          this.document.load(this.url);
  331.          this.loaded = true;
  332.       } catch (Exception var5) {
  333.          this.setError("Error loading XML document '" + var1 + "'.  " + ((Throwable)var5).toString());
  334.       }
  335.  
  336.       if (this.loaded && this.schema != null) {
  337.          this.updateSchema();
  338.       }
  339.  
  340.    }
  341.  
  342.    public void handleUpdateString(String var1) {
  343.       Document var2 = this.parseXML(var1);
  344.       this.handleUpdate(var2.getRoot());
  345.    }
  346.  
  347.    public void updateSchema() {
  348.       this.schema = new Document();
  349.       String var1 = ((Applet)this).getParameter("SCHEMA");
  350.       if (var1 != null && var1.length() > 0) {
  351.          this.schema = this.parseXML(var1);
  352.          this.schemaRoot = this.schema.getRoot();
  353.       } else if (this.document != null && this.document.getRoot() != null) {
  354.          Element var2 = this.document.getRoot();
  355.          SchemaNode var3 = new SchemaNode(this.schema, this.schema, var2.getTagName());
  356.          this.generateSchema(var2, var3);
  357.          ElementEnumeration var4 = new ElementEnumeration(this.schema.getRoot(), XMLRowsetProvider.nameROWSET, 0);
  358.          this.schemaRoot = (Element)var4.nextElement();
  359.       }
  360.  
  361.       this.notifyListeners();
  362.    }
  363.  
  364.    public void save(String var1) {
  365.       if (this.document != null) {
  366.          try {
  367.             FileOutputStream var2 = new FileOutputStream(var1);
  368.             this.document.save(this.document.createOutputStream(var2));
  369.             return;
  370.          } catch (Exception var4) {
  371.             this.setError(((Throwable)var4).toString());
  372.          }
  373.       }
  374.  
  375.    }
  376.  
  377.    public void removeDataSourceListener(DataSourceListener var1) {
  378.       this.myDSL = null;
  379.    }
  380.  
  381.    public OLEDBSimpleProvider msDataSourceObject(String var1) {
  382.       if (this.document != null && this.document.getRoot() != null && this.schemaRoot != null) {
  383.          this.myProvider = new XMLRowsetProvider(this.document.getRoot(), this.schemaRoot, this.document, (XMLRowsetProvider)null);
  384.       } else {
  385.          this.myProvider = null;
  386.       }
  387.  
  388.       return this.myProvider;
  389.    }
  390.  
  391.    public void addDataSourceListener(DataSourceListener var1) throws TooManyListenersException {
  392.       this.myDSL = var1;
  393.    }
  394.  
  395.    public void clear() {
  396.       this.document = new Document();
  397.       this.updateSchema();
  398.    }
  399.  
  400.    public void notifyListeners() {
  401.       if (this.myDSL != null) {
  402.          try {
  403.             this.myDSL.dataMemberChanged("");
  404.             return;
  405.          } catch (Exception var3) {
  406.             this.setError("Error notifying data members changed: " + ((Throwable)var3).toString());
  407.          }
  408.       }
  409.  
  410.    }
  411.  
  412.    public void init() {
  413.       super.init();
  414.       String var1 = ((Applet)this).getParameter("URL");
  415.       if (var1 != null && var1.length() > 0) {
  416.          this.load(var1);
  417.       } else {
  418.          this.loaded = true;
  419.          var1 = ((Applet)this).getParameter("ID");
  420.          if (var1 != null && var1.length() > 0) {
  421.             Object var2 = null;
  422.  
  423.             try {
  424.                var7 = (JSObject)((JSObject)JSObject.getWindow(this).getMember("document")).getMember(var1);
  425.             } catch (Exception var5) {
  426.                this.setError("Error finding <APPLET> with ID=" + var1 + ": " + ((Throwable)var5).toString());
  427.                return;
  428.             }
  429.  
  430.             if (var7 != null) {
  431.                String var3 = (String)var7.getMember("altHtml");
  432.                if (var3 != null && var3.length() > 0) {
  433.                   this.document = this.parseXML(var3);
  434.                   this.inlineXML = true;
  435.                }
  436.             } else {
  437.                this.setError("Error finding <APPLET> with ID=" + var1);
  438.             }
  439.          } else {
  440.             this.setError("No PARAM with NAME=URL was found, " + "so perhaps you specified the XML inside the APPET tag " + "but in order for this to work you must also specify " + "<PARAM NAME=\"APPLET\" VALUE=\"xmldso\">" + " where the value matches the ID of your APPLET tag.");
  441.          }
  442.       }
  443.  
  444.       this.updateSchema();
  445.    }
  446.  
  447.    public String getError() {
  448.       return this.error;
  449.    }
  450.  
  451.    private void setError(String var1) {
  452.       this.error = var1;
  453.       ((Component)this).repaint();
  454.    }
  455.  
  456.    public Document parseXML(String var1) {
  457.       Document var2 = new Document();
  458.       if (var1 == null) {
  459.          return var2;
  460.       } else {
  461.          try {
  462.             var2.load(new StringBufferInputStream(var1));
  463.          } catch (Exception var5) {
  464.             this.setError("Caught exception parsing given XML.  " + ((Throwable)var5).toString());
  465.          }
  466.  
  467.          return var2;
  468.       }
  469.    }
  470.  
  471.    public void saveSchema(String var1) {
  472.       if (this.schema != null) {
  473.          try {
  474.             FileOutputStream var2 = new FileOutputStream(var1);
  475.             this.schema.save(new XMLOutputStream(var2));
  476.             return;
  477.          } catch (Exception var4) {
  478.             this.setError(((Throwable)var4).toString());
  479.          }
  480.       }
  481.  
  482.    }
  483.  
  484.    int getColumn(Element var1, Element var2) {
  485.       int var3 = 0;
  486.       Enumeration var4 = var1.getElements();
  487.  
  488.       while(var4.hasMoreElements()) {
  489.          ++var3;
  490.          Element var5 = (Element)var4.nextElement();
  491.          String var6 = var5.getAttribute("NAME").toString();
  492.          String var7 = var2.getTagName().toString();
  493.          if (var6.equals(var7)) {
  494.             return var3;
  495.          }
  496.       }
  497.  
  498.       return 0;
  499.    }
  500. }
  501.